# -*- coding: utf-8 -*-
"""
使用jsonpath-ng库解决原问题的完整示例
问题1: 匹配带小括号的特殊字段 '厂商指导价(元)'
问题2: 使用正则表达式匹配包含 '厂商指导价' 的所有字段
"""

# 安装: pip install jsonpath-ng
from jsonpath_ng.ext import parse

# 示例数据
data = {
	"returncode": 0,
	"message": "成功",
	"result": {
		"specid": 66917,
		"paramtypeitems": [{
			"name": "基本参数",
			"paramitems": [{
				"id": 113,
				"name": "车型名称",
				"displaytype": 0,
				"value": "零跑C11 2024款 纯电 580激光雷达版",
				"sublist": []
			},
			{
				"id": 112,
				"name": "厂商指导价(元)",
				"displaytype": 0,
				"value": "17.88万",
				"sublist": []
			},
			{
				"id": 111,
				"name": "厂商",
				"displaytype": 0,
				"value": "零跑汽车",
				"sublist": []
			},
			{
				"id": 110,
				"name": "厂商指导价",
				"displaytype": 0,
				"value": "16.88万",
				"sublist": []
			},
		],
		"subparamitems": []
		}
		]
	}
}

print("=== 使用 jsonpath-ng 解决原问题 ===\n")

# 问题1解决方案: 匹配带小括号的特殊字段
print("【问题1】匹配带小括号的特殊字段 '厂商指导价(元)'")

# 方法1: 使用正确的递归查询语法（不需要显式指定paramitems）
try:
    # 使用 $..* 先找到所有对象，再过滤
    expr1 = parse("$..*[?(@.name=='厂商指导价(元)')].value")
    result1 = [match.value for match in expr1.find(data)]
    print("方法1 - 递归查询+过滤:")
    print(f"  表达式: $..*[?(@.name=='厂商指导价(元)')].value")
    print(f"  结果: {result1}")
    print(f"  说明: 不需要显式指定paramitems，自动在所有层级查找")
except Exception as e:
    print(f"方法1 - 递归查询出错: {str(e)}")

# 问题2解决方案: 使用正则表达式
print("\n【问题2】使用正则表达式匹配包含 '厂商指导价' 的所有字段")
try:
    # 使用正确的递归查询语法进行正则匹配
    expr2 = parse("$..*[?(@.name=~'.*厂商指导价.*')].value")
    regex_result = [match.value for match in expr2.find(data)]
    print("正则表达式匹配:")
    print(f"  表达式: $..*[?(@.name=~'.*厂商指导价.*')].value")
    print(f"  结果: {regex_result}")
    print(f"  说明: 不需要显式指定paramitems，使用正则表达式匹配所有层级")
except Exception as e:
    print(f"正则表达式匹配出错: {str(e)}")

# 添加备选方案
print("\n【备选方案】使用更精确的递归路径（更高效）:")
try:
    # 从result节点开始递归查找，避免在整个文档中搜索
    expr_alt = parse("$..result..*[?(@.name=~'.*厂商指导价.*')].value")
    alt_result = [match.value for match in expr_alt.find(data)]
    print(f"  表达式: $..result..*[?(@.name=~'.*厂商指导价.*')].value")
    print(f"  结果: {alt_result}")
    print(f"  说明: 从特定节点开始搜索，性能更好")
except Exception as e:
    print(f"备选方案出错: {str(e)}")
